home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / libs / sphigs / sph_mac.hqx / SRGP port to 5.0 (compressed) / SRGP_SPHIGS Root / MacSRGP / geom.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-13  |  3.7 KB  |  182 lines

  1. #include "HEADERS.h"
  2.  
  3. #include "srgp.h"
  4. #include "geom.h"
  5.  
  6. #include "geom.proto.h"
  7. static void GEOM_calc_intersection_on_1_axis(int, int, int, int, int *, int *, int *);
  8.  
  9.  
  10. /*!*/
  11. srgp__point GEOM_sumOfPoints (srgp__point pt1, srgp__point pt2)
  12. {
  13.    point psum;
  14.  
  15.    psum.x = pt1.x + pt2.x;
  16.    psum.y = pt1.y + pt2.y;
  17.    return psum;
  18. }
  19.  
  20.  
  21.  
  22. /*!*/
  23. int GEOM_widthOfRect (srgp__rectangle r)
  24. {
  25.    return r.top_right.x - r.bottom_left.x + 1;
  26. }
  27.  
  28. int GEOM_heightOfRect (srgp__rectangle r)
  29. {
  30.    return r.top_right.y - r.bottom_left.y + 1;
  31. }
  32.  
  33.  
  34.  
  35.  
  36. /*!*/
  37. static void
  38. GEOM_calc_intersection_on_1_axis
  39.    (int min_a, int max_a, int min_b, int max_b, 
  40.     int *does_intersect, int *min_c, int *max_c)
  41. {
  42.    int min_t, max_t;
  43.  
  44.    /* FIRST, REARRANGE a && b SO THAT mina <== minb */
  45.    if (! (min_a <= min_b)) {
  46.       min_t = min_a;  max_t = max_a;
  47.       min_a = min_b;  max_a = max_b;
  48.       min_b = min_t;  max_b = max_t;
  49.    }
  50.  
  51.    /* THEN, PERFORM INTERSECTION */
  52.    if (min_b > max_a) 
  53.       *does_intersect = FALSE;
  54.    else {
  55.       *does_intersect = TRUE;
  56.       *min_c = min_b;
  57.       if (max_a < max_b) 
  58.      *max_c = max_a;
  59.       else
  60.      *max_c = max_b;
  61.    }
  62. }
  63.       
  64.  
  65.  
  66. /*!*/
  67. int GEOM_computeRectIntersection 
  68.    (srgp__rectangle r1, srgp__rectangle r2, 
  69.     srgp__rectangle *result)
  70. {
  71.    int does_intersect;
  72.  
  73.    /* first: X axis */
  74.    GEOM_calc_intersection_on_1_axis
  75.       (r1.bottom_left.x, r1.top_right.x, r2.bottom_left.x, r2.top_right.x,
  76.        &does_intersect, 
  77.        &(result->bottom_left.x), &(result->top_right.x));
  78.  
  79.    if (does_intersect)
  80.       /* then: Y axis */
  81.       GEOM_calc_intersection_on_1_axis
  82.      (r1.bottom_left.y, r1.top_right.y, r2.bottom_left.y, r2.top_right.y,
  83.       &does_intersect, 
  84.       &(result->bottom_left.y), &(result->top_right.y));
  85.  
  86.    return does_intersect;
  87. }
  88.  
  89.  
  90.  
  91.  
  92. /*!*/
  93. void
  94. GEOM_computeRectUnion 
  95.    (srgp__rectangle r1, srgp__rectangle r2, 
  96.     srgp__rectangle *result)
  97. {
  98.    *result = r2;
  99.    if (r1.bottom_left.x < result->bottom_left.x) 
  100.       result->bottom_left.x = r1.bottom_left.x;
  101.    if (r1.top_right.x > result->top_right.x) 
  102.       result->top_right.x =  r1.top_right.x;
  103.    if (r1.bottom_left.y < result->bottom_left.y) 
  104.       result->bottom_left.y = r1.bottom_left.y;
  105.    if (r1.top_right.y > result->top_right.y) 
  106.       result->top_right.y =  r1.top_right.y;
  107. }
  108.  
  109.  
  110.  
  111.  
  112. /*!*/
  113. srgp__rectangle GEOM_rectWithCommonCenter 
  114.    (srgp__rectangle r, int rect_width, int rect_height)
  115. {
  116.    rectangle rect_with_common_center;
  117.  
  118.    rect_with_common_center.bottom_left = 
  119.       GEOM_sumOfPoints
  120.      (r.bottom_left,
  121.       SRGP_defPoint
  122.          ((GEOM_widthOfRect(r) - rect_width) >> 1,
  123.           (GEOM_heightOfRect(r) - rect_height) >> 1));
  124.  
  125.    rect_with_common_center.top_right =
  126.       GEOM_sumOfPoints
  127.      (rect_with_common_center.bottom_left,
  128.       SRGP_defPoint (rect_width-1, rect_height-1));
  129.  
  130.    return rect_with_common_center;
  131. }
  132.  
  133.  
  134.  
  135.  
  136. /*!*/
  137. srgp__rectangle GEOM_rectFromDiagPoints (srgp__point pt1, srgp__point pt2)
  138. {
  139.    rectangle result;
  140.  
  141.    if (pt1.x < pt2.x) 
  142.       {
  143.      result.bottom_left.x = pt1.x;
  144.      result.top_right.x = pt2.x;
  145.       }
  146.    else
  147.       {
  148.      result.top_right.x = pt1.x;
  149.      result.bottom_left.x = pt2.x;
  150.       }
  151.  
  152.    if (pt1.y < pt2.y) 
  153.       {
  154.      result.bottom_left.y = pt1.y;
  155.      result.top_right.y = pt2.y;
  156.       }
  157.    else
  158.       {
  159.      result.top_right.y = pt1.y;
  160.      result.bottom_left.y = pt2.y;
  161.       }
  162.    
  163.    return result;
  164. }
  165.  
  166.  
  167.  
  168.  
  169. /*!*/
  170. /** GEOM PT IN RECT
  171. This function strains for efficiency by exiting as soon as a
  172. reject can be made.  The "nicer" Pascal version (using the &&
  173. conjunction and only one if statement) would not be efficient.
  174. **/
  175. int GEOM_ptInRect (srgp__point pt, srgp__rectangle r)
  176. {
  177.    return (pt.x >= r.bottom_left.x) &&
  178.           (pt.x <= r.top_right.x) &&
  179.       (pt.y >= r.bottom_left.y) &&
  180.       (pt.y <= r.top_right.y);
  181. }
  182.